package com.rw.tool.util.string;

import java.util.Objects;

/**
 * 字符串工具类
 */
public class StringUtil {
    public static final String EMPTY = "";

    /**
     * 判断字符串是否为null或为空
     */
    public static boolean isEmpty(String str) {
        return Objects.isNull(str) || str.isEmpty();
    }

    /**
     * 判断字符串是否为null、空、或空白字符串
     */
    public static boolean isBlank(String str) {
        return isEmpty(str) || isEmpty(str.trim());
    }

    /**
     * 判断两个字符串是否相等
     * 若两个字符串中其中一个为null，则不相等
     */
    public static boolean equals(String left, String right) {
        return !Objects.isNull(left) && left.equals(right);
    }

    /**
     * 判断两个字符串是否相等，忽略大小写
     * 若两个字符串中其中一个为null，则不相等
     */
    public static boolean equalsIgnoreCase(String left, String right) {
        return !Objects.isNull(left) && left.equalsIgnoreCase(right);
    }

    /**
     * 判断字符串是否包含另一个子串
     * 如果字符串为null，则不包含
     */
    public static boolean contains(String left, String right) {
        if (Objects.isNull(left)) {
            return false;
        }
        return left.contains(right);
    }

    /**
     * 判断字符串是否以另一个子串结尾
     * 如果字符串为null，则为false
     */
    public static boolean endsWith(String str, String suffix) {
        if (Objects.isNull(str)) {
            return false;
        }
        return str.endsWith(suffix);
    }

    /**
     * 判断字符串是否以另一个子串开头
     * 如果字符串为null，则为false
     */
    public static boolean startsWith(String str, String prefix) {
        if (Objects.isNull(str)) {
            return false;
        }
        return str.startsWith(prefix);
    }

    /**
     * 判断字符串是否匹配正则表达式
     * 如果字符串为null，则为false
     */
    public static boolean matches(String str, String regex) {
        if (Objects.isNull(str)) {
            return false;
        }
        return str.matches(regex);
    }

    /**
     * 判断一个字符串中是否只包涵数字
     * 如果字符串中有任何符号或空格，包括负号、小数点，都依然会返回false
     * 如果字符串为空字符串或null，则返回false
     */
    public static boolean isNumeric(String str) {
        if (isEmpty(str)) {
            return false;
        }

        // 判断每一位字符是否是数字
        char[] chars = str.toCharArray();
        for (char c : chars) {
            if (!Character.isDigit(c)) {
                return false;
            }
        }
        return true;
    }

    /**
     * 判断字符串是否为这个长度
     */
    public static boolean lengthIs(String str, int length) {
        if (str == null) {
            return false;
        }
        return str.length() == length;
    }

    /**
     * 判断字符串是否在这个长度区间内
     * 两边都包括在内
     */
    public static boolean lengthIn(String str, int min, int max) {
        if (str == null) {
            return false;
        }
        return str.length() >= min && str.length() <= max;
    }
}
